package com.twb.auth.controller;

import java.util.List;
import java.util.Set;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.twb.auth.entity.twbOrganization.TwbOrganization;
import com.twb.auth.entity.twbOrganization.dto.GetTwbOrganizationByIdDto;
import com.twb.auth.entity.twbOrganization.dto.SearchTwbOrganizationDto;
import com.twb.auth.entity.twbOrganization.dto.SearchTwbOrganizationTreeDto;
import com.twb.auth.entity.twbOrganization.dto.TwbOrganizationDto;
import com.twb.auth.entity.twbOrganization.vo.SaveTwbOrganizationVo;
import com.twb.auth.entity.twbOrganization.vo.SearchTwbOrganizationTreeVo;
import com.twb.auth.entity.twbOrganization.vo.SearchTwbOrganizationVo;
import com.twb.auth.entity.twbOrganization.vo.UpdateTwbOrganizationByIdVo;
import com.twb.auth.service.ITwbOrganizationService;
import com.twb.core.base.Result;
import com.twb.core.base.controller.BaseController;
import com.twb.core.base.entity.TwbPageInfo;
import com.twb.core.security.annotation.Auth;
import com.twb.core.util.BeanUtils;
import com.twb.core.util.Results;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

/**
 * @ClassName TwbOrganizationController
 * @Description 机构管理
 * @author DSY
 * @date 2018年11月15日 上午10:01:42
 */
@RestController
@RequestMapping("/sys/twbOrganization")
@Api(value = "TwbOrganizationController", tags = "组织机构管理接口")
public class TwbOrganizationController extends BaseController {

	@Autowired
	ITwbOrganizationService twbOrganizationService;

	/**
	 * @Title  searchTwbOrganization
	 * @Description 分页查询组织机构
	 * @param vo
	 * @param pageVo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:09:33
	 */
	@GetMapping("/search")
	@ApiOperation(value = "分页查询组织机构")
	public Result<TwbPageInfo<SearchTwbOrganizationDto>> searchTwbOrganization(SearchTwbOrganizationVo vo) {
		TwbPageInfo<SearchTwbOrganizationDto> result = twbOrganizationService.searchTwbOrganization(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title  searchTwbOrganizationTree
	 * @Description 组织机构树查询
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:34:53
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchTree")
	@ApiOperation(value = "组织机构树查询")
	public Result<List<SearchTwbOrganizationTreeDto>> searchTwbOrganizationTree(SearchTwbOrganizationTreeVo vo) {
		List<SearchTwbOrganizationTreeDto> list = twbOrganizationService.searchTwbOrganizationTree(vo);
		return Results.successWithData(list);
	}

	/**
	 * @Title  searchUserOrganizationTree
	 * @Class: TwbOrganizationController.java
	 * @Description 查询用户机构树
	 * @param userId
	 * @return
	 * @author DSY
	 * @date 2018年11月25日 下午9:00:11
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchUserOrgTree")
	@ApiOperation(value = "组织机构树查询")
	public Result<List<TwbOrganizationDto>> searchUserOrganizationTree(
			@NotBlank @RequestParam @ApiParam(value = "用户ID", name = "userId", required = true) String userId) {
		List<TwbOrganizationDto> list = twbOrganizationService.searchUserOrganizationTree(userId);
		return Results.successWithData(list);
	}

	/**
	 * @Title  getTwbOrganizationById
	 * @Description 根据ID获取组织机构详情
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:48:30
	 */
	@GetMapping("/getById")
	@ApiOperation(value = "根据ID获取组织机构详情")
	public Result<GetTwbOrganizationByIdDto> getTwbOrganizationById(
			@NotBlank @RequestParam @ApiParam(value = "序号", name = "id", required = true) String id) {
		GetTwbOrganizationByIdDto dto = twbOrganizationService.getTwbOrganizationById(id);
		return Results.successWithData(dto);
	}

	/**
	 * @Title  saveTwbOrganization
	 * @Description 保存组织机构
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:56:36
	 */
	@PostMapping("/save")
	@ApiOperation(value = "保存组织机构")
	public Result<String> saveTwbOrganization(@RequestBody @Valid SaveTwbOrganizationVo vo) {

		String result = twbOrganizationService.saveTwbOrganization(vo);
		if (result != null) {
			return Results.success("保存成功");
		} else {
			return Results.failure("保存失败");
		}
	}

	/**
	 * @Title  updateTwbOrganization
	 * @Description 
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午11:19:27
	 */
	@PutMapping("/updateById")
	@ApiOperation(value = "更新组织机构")
	public Result<String> updateTwbOrganizationById(@RequestBody @Valid UpdateTwbOrganizationByIdVo vo) {
		TwbOrganization twbOrganization = twbOrganizationService.getById(vo.getId());
		if (null == twbOrganization) {
			return Results.failure("组织机构不存在");
		}

		if (!twbOrganization.getCode().equals(vo.getCode())) {
			TwbOrganization record = new TwbOrganization();
			record.setCode(vo.getCode());
			record.setIsdel(0);
			long count = twbOrganizationService.count(record);
			if (count > 0) {
				return Results.failure("编码[" + vo.getCode() + "]已存在");
			}
		}

		BeanUtils.copyProperties(vo, twbOrganization);
		twbOrganizationService.setUpdateInfo(twbOrganization);

		boolean result = twbOrganizationService.updateById(twbOrganization);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  logicDeleteTwbOrganizationById
	 * @Description 逻辑删除组织机构信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午11:24:09
	 */
	@PostMapping("/logicDeleteById")
	@ApiOperation(value = "逻辑删除组织机构信息")
	public Result<String> logicDeleteTwbOrganizationById(@NotBlank @RequestParam String id) {
		TwbOrganization record = twbOrganizationService.getById(id);
		if (null == record) {
			return Results.failure("组织机构不存在");
		}
		record.setId(id);
		twbOrganizationService.setUpdateInfo(record);
		record.setIsdel(1);
		boolean result = twbOrganizationService.updateById(record);
		if (result) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  deleteTwbOrganizationById
	 * @Description 删除组织机构信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午5:51:57
	 */
	@PostMapping("/deleteById")
	@ApiOperation(value = "删除组织机构信息")
	public Result<String> deleteTwbOrganizationById(@NotBlank @RequestParam String id) {
		boolean result = twbOrganizationService.deleteTwbOrganizationById(id);
		if (result) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  updateOrgSeqById
	 * @Description 更新组织机构顺序号
	 * @param id
	 * @param orgSeq
	 * @return
	 * @author DSY
	 * @date 2018年11月13日 下午2:15:54
	 */
	@PostMapping("/updateSeq")
	@ApiOperation(value = "更新组织机构顺序号")
	public Result<String> updateOrgSeqById(@NotBlank @RequestParam String id, @NotNull @RequestParam Integer orgSeq) {
		TwbOrganization record = twbOrganizationService.getById(id);
		if(record == null) {
			return Results.failure("组织机构不存在");
		}
		record.setOrgSeq(orgSeq);
		twbOrganizationService.setUpdateInfo(record);
		boolean result = twbOrganizationService.updateById(record);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  saveOrgResource
	 * @Description 保存机构权限
	 * @param roleId
	 * @param resIds
	 * @return
	 * @author DSY
	 * @date 2018年11月22日 下午5:35:31
	 */
	@PostMapping("/saveOrgResource")
	@ApiOperation(value = "保存机构权限")
	public Result<String> saveOrgResource(@NotBlank @RequestParam String orgId, @NotBlank @RequestParam String resIds) {
		int result = twbOrganizationService.saveOrgResource(orgId, resIds);
		if (result > 0) {
			return Results.success("授权成功");
		} else {
			return Results.failure("授权失败");
		}
	}

	/**
	 * @Title validCode
	 * @Description 验证机构编码是否存在
	 * @param code
	 * @return
	 * @author DSY
	 * @date 2020年7月10日 上午10:03:02
	 */
	@Auth(verifyURL = false)
	@GetMapping("/validCode")
	@ApiOperation(value = "验证机构编码是否存在")
	public Boolean validCode(@NotBlank @RequestParam String code) {

		TwbOrganization record = new TwbOrganization();
		record.setCode(code);
		record.setIsdel(0);

		long count = twbOrganizationService.count(record);

		if (count > 0) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * @Title searchOrgParentNames
	 * @Description 根据机构ID查询父级机构名称
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2020年7月16日 上午11:32:01
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchOrgParentNames")
	@ApiOperation(value = "根据机构ID查询父级机构名称")
	public Result<String> searchOrgParentNames(@NotBlank @RequestParam String id) {
		String orgParentNames = twbOrganizationService.getOrgParentNames(id);

		return Results.successWithData(orgParentNames);
	}
	/**
	 * @Title resetSearchKey
	 * @Description 重置组织机构SearchKey
	 * @return
	 * @AuthorOriginally DHL
	 * @date 2021年7月19日 下午1:05:56
	 */
	@GetMapping("/resetSearchKey")
	@ApiOperation(value = "重置组织机构SearchKey")
	public Result<String> resetSearchKey() {
		int result = twbOrganizationService.resetSearchKey();

		if (result > 0) {
			return Results.success("重置成功");
		} else {
			return Results.failure("重置失败");
		}
	}
	
	/**
	 * @Title searchUserOrgs
	 * @Description 查询用户的所有机构信息
	 * @param userId
	 * @return
	 * @AuthorOriginally DHL
	 * @date 2021年4月1日 上午11:32:06
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchUserOrgs")
	@ApiOperation(value = "查询用户的所有机构信息")
	public Result<Set<TwbOrganization>> searchUserOrgs(@NotBlank @RequestParam @ApiParam(value = "用户ID", name = "userId", required = true) String userId) {
		
		// 加载部门信息
		Set<TwbOrganization> orgs = twbOrganizationService.listOrganizationByUserId(userId);
		
		return Results.successWithData(orgs);
	}
}
